/**
 * Description:
 * Class Name:FilterTest
 * Date:2022/5/2 19:21
 *
 * @author LTisme
 * @version JAVA17
 */
package 疯狂Java讲义.第15章_输入输出._15_8_Java9改进的对象序列化._15_8_4_Java9增加的过滤功能;

import 疯狂Java讲义.第15章_输入输出._15_8_Java9改进的对象序列化._15_8_2_使用对象流实现序列化.Person;

import java.io.FileInputStream;
import java.io.ObjectInputFilter;
import java.io.ObjectInputStream;

public class FilterTest {
    public static void main(String[] args) {
        try (
                var ois = new ObjectInputStream(new FileInputStream("Chapter_15_8_object.txt"))
                ){
            ois.setObjectInputFilter((info) ->{
                System.out.println("==执行数据过滤==");
                ObjectInputFilter serialFilter = ObjectInputFilter.Config.getSerialFilter();
                if (serialFilter != null){
                    // 首先使用ObjectInputFilter执行默认的检查
                    ObjectInputFilter.Status status = serialFilter.checkInput(info);
                    // 如果默认检查的结果不是Status.UNDECIDED
                    if (status != ObjectInputFilter.Status.UNDECIDED){
                        return status;
                    }
                }
                // 如果想要恢复的对象不是一个，则不允许恢复对象
                if (info.references() != 1){
                    return ObjectInputFilter.Status.REJECTED;
                }
                // 如果想要恢复的对象不是Person类，则不允许恢复对象
                if (info.serialClass() != null && info.serialClass() != Person.class){
                    return ObjectInputFilter.Status.REJECTED;
                }
                return ObjectInputFilter.Status.UNDECIDED;
            });

            // 从输入流中读取一个Java对象，并将其强制类型转换为Person类
            var p = (Person) ois.readObject();
            System.out.println(p.getName() + p.getAge());
        }
        catch (Exception e){
            e.printStackTrace();
        }
    }
}
